<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        (function(){
            function fac(num){
                if(num===1){
                    return 1;
                }else{
                    // return num*fac(num-1);
                    // arguments.callee 指向正在执行的函数的指针
                    // 但在严格模式下访问出错
                    return num*arguments.callee(num-1);
                }
            }
             
            var another=fac;
            fac=null;
            console.log(another(5));
        })();

        (function(){
            function fac1(str){
                // 在内部创建了一个新的函数并返回，把执行代码放入这个函数体内，
                // 即使外部函数赋值给了另一个变量，函数的名字f仍然有效
                // 这种方式在严格模式下也能访问
                return function f(a){
                    console.log("始终可以引用外部函数的变量"+str);
                    if(a===1){
                        return 1;
                    }else{
                        return a*f(a-1);
                    }
                }
            }

            console.log(fac1("OAOA")(3));

            var another1=fac1;
            fac1=null;
            console.log(another1('OBOB')(4));
        })();
    </script>

</body>

</html>